package estadistec.grafico;


import java.awt.*;
import java.io.File;
import java.io.IOException;

import javax.swing.*;
import javax.swing.border.*;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;


import javax.xml.parsers.ParserConfigurationException;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

import java.util.*;

/**
 * Clase que contiene todas las variables de entorno que el sistema necesita
 * para levantar como lo son el tamanno de la ventana, el juego de colores
 * y las demas caracteristicas del mismo.
 * @author julatec
 */


public  class ConfiguracionGrafica {
	public static String recursos = "res/", config = "config.xml",
	border = "border.xml", botonSet = "boton_set.xml",
	colorSet = "color_set.xml";

	private static DocumentBuilderFactory factory;
	private static DocumentBuilder builder;
	private static Document document;

	private static void inicializar() throws ParserConfigurationException, org.xml.sax.SAXException, IOException {
		document = builder.parse(new File(recursos + config));
	}

	static {
		try {
			factory = DocumentBuilderFactory.newInstance();
			builder = factory.newDocumentBuilder();
		    } 
		catch (Exception e) {
			e.printStackTrace(System.err);
			System.exit(0);
		}
	}

	
	/**
	 * Direccion del archivo de confiracion por defecto.
	 */

	public static final String TEMA_PATH="res/color_set.xml";

	/**
	 * Dimension de la ventena principial.
	 */
	protected Dimension TAMANO_VENTANA=new Dimension(1000,700);

	/**
	 * Dimension de las ventanas internas
	 */
	protected Dimension TAMANO_VENTANA_INTERNA=new Dimension(400,300);

	/**
	 * Tabla que contiene las dimensiones que el sisteme tiene establecido.
	 */
	protected Hashtable<String, Dimension> dimensiones=new Hashtable<String, Dimension>();

	/**
	 * Tabla que contiene las posiciones que el sisteme tiene estatblecido.
	 */
	protected Hashtable<String, Point> localizaciones=new Hashtable<String, Point>();

	/**
	 * Tabla que contiene las imagenes que el sisteme tiene establecido.
	 */
	protected Hashtable<String, ImageIcon> imagenes=new Hashtable<String, ImageIcon>();

	/**
	 * Tabla que contiene las rutas de las imagenes que el sisteme tiene
	 * estatlecido.
	 */
	protected Hashtable<String, String> imagenesRutas=new Hashtable<String, String>();

	/**
	 * Borde del sistema por defecto
	 */
	protected Border borde;

	/**
	 * Fuente del sistema.
	 */
	protected Font fuente;

	/**
	 * Dimension de la Ventana Principal
	 */
	protected Dimension RESOLUCION;

	/**
	 * Rectangulo de la ventana principal
	 */
	protected Rectangle MARCO;

	/**
	 * Carga toda la configuracion del sistema desde el archivo de
	 * que se encuentra en CONFIG_PATH
	 * @param nombre
	 * @return Punto que se solicito.
	 *     un punto relacionado con un nombre especifico.
	 */
	protected Point cargarPunto(String nombre){
		return localizaciones.get(nombre);
	}

	/**
	 * Retorna una dimension relacionada con un nombre especifico.
	 * @param nombre
	 * @return Dimension que se solicito.
	 */
	protected Dimension cargarDimension(String nombre){
		return dimensiones.get(nombre);
	}

	/**
	 * Retorna una imagen relacionada con un nombre especifico.
	 * @param nombre
	 * @return Imagen que se solicito.
	 */
	protected ImageIcon cargarImagen(String nombre){
		ImageIcon imagen=imagenes.get(nombre);
		if(imagen==null){
			imagen=new ImageIcon(imagenesRutas.get(nombre));
			imagenes.put(nombre, imagen);
		}
		return imagen;
	}

	/**
	 * Carga toda la configuracion del sistema desde el archivo de
	 * que se encuentra en CONFIG_PATH
	 */
	public void cargarConfiguracion(Cortina cortina){

		// Crear el dom
		try {
			inicializar();
		} catch (ParserConfigurationException e) {
			e.printStackTrace();
			return;
		} catch (SAXException e) {
			e.printStackTrace();
			return;
		} catch (IOException e) {
			e.printStackTrace();
			return;
		}

		// Cargar las dimensiones
		NodeList dimensiones = document.getElementsByTagName("dimension");
		for (int i = 0, largo = dimensiones.getLength(); i < largo; i++) {
			Node node = dimensiones.item(i);
			if (node instanceof Element) {
				Element dimension = (Element) node;
				this.dimensiones
						.put(dimension.getAttribute("id"), new Dimension(
								Integer.parseInt(dimension
										.getAttribute("width")), Integer
										.parseInt(dimension
												.getAttribute("height"))));
			}
		}

		//Cargar las localizaciones
		NodeList localizaciones = document.getElementsByTagName("piont");
		for (int i = 0, largo = localizaciones.getLength(); i < largo; i++) {
			Node node = localizaciones.item(i);
			if (node instanceof Element) {
				Element localizacion = (Element) node;
				this.localizaciones.put(localizacion.getAttribute("id"),
						new Point(Integer.parseInt(localizacion
								.getAttribute("x")), Integer
								.parseInt(localizacion.getAttribute("y"))));
			}
		}

		// Cargar el nombre de las imagenes
		NodeList imagenes = document.getElementsByTagName("imagen");
		for (int i = 0, largo = imagenes.getLength(); i < largo; i++) {
			Node node = imagenes.item(i);
			if (node instanceof Element) {
				Element imagen = (Element) node;
				cortina.mostrarMensaje("Cargando: " + recursos
						+ imagen.getAttribute("src") + " ID: "
						+ imagen.getAttribute("id"));
				this.imagenesRutas.put(imagen.getAttribute("id"),
						recursos + imagen.getAttribute("src"));
			}
		}

		// Establecer el tamano de la ventana principal
		this.RESOLUCION = this.dimensiones.get("RESOLUCION");
		this.MARCO = new Rectangle(ConstantesGraficas.ORIGEN, this.RESOLUCION);

	}

}
